﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GestionePolveri2.DAL;
using GestionePolveriLib.BL.Reports;
using LinqKit;
using FrameworkLib.Facades;

namespace GestionePolveriLib.Facades.Reports
{
    public class Report521Facade : FacadeBase<GestionePolveriEntities>
    {
        Filter521 m_filter = null;

        public Report521Facade(Filter521 filter)
        {
            m_filter = filter;
        }

        public List<Report521> GetReport521Data()
        {
            List<Report521> retValue = null;

            retValue = GetReport521Default2();

            return retValue;
        }

        public List<Report521> GetReport521Default2()
        {
            List<Report521> retValue = null;

            IQueryable<Report521> obj = null;

            if (m_filter.ColoreID != -1)
            {
                obj = GetDataByColore();
            }
            else
            {
                if (m_filter.FamigliaColoreID != -1)
                {
                    obj = GetDataByFamiglia();
                }
                else
                {
                    if (m_filter.PolvereID != -1)
                    {
                        obj = GetDataByPolvere();
                    }
                    else
                    {
                        obj = GetDataAll();
                    }
                }
            }

            if (obj.Any())
            {
                retValue = obj.ToList();

            }

            return retValue;
        }

        private IQueryable<Report521> GetDataByPolvere()
        {
            GestionePolveriEntities context = this.GetContext();
            var obj = from c in context.vw_InventarioMagazzino
                      where ((c.DataDdt >= m_filter.PeriodFrom) && (c.DataDdt <= m_filter.PeriodTo))
                            && c.IDPolvere == m_filter.PolvereID
                      select new Report521
                      {
                          IDLotto = c.IDLotto,
                          DataDdt = c.DataDdt,
                          Giacenza = c.Giacenza,
                          PrezzoUnitario = (from k in context.Lotti where k.IDPolvere == c.IDPolvere orderby k.DataFattura select k).FirstOrDefault().PrezzoUnitario,
                          //PrezzoUnitario = l.PrezzoUnitario,
                          CodicePolvere = c.CodicePolvere,
                          NumDdt = c.NumDdt,
                          Famiglia = c.Famiglia,
                          CodLotto = c.CodLotto,
                          CodiceCausale = c.CodCausale,
                          Quantita = c.Quantita,
                          DatiAbbinati = (from cc1 in context.ComposizioneColori
                                          where cc1.AnagPolveri.CodicePolvere == c.CodicePolvere
                                          select new Dati_Associati
                                          {
                                              ColoriAbbinati = cc1.AnagColori.CodiceColore + ", ",
                                              Famiglia = cc1.AnagColori.AnagFamiglie.Descrizione + ", "
                                          })
                      };
            return obj;
        }

        private IQueryable<Report521> GetDataAll()
        {
            GestionePolveriEntities context = this.GetContext();
            //var obj = from c in context.vw_InventarioMagazzino
            //          where (((c.DataDdt >= m_filter.PeriodFrom) && (c.DataDdt <= m_filter.PeriodTo)) || (c.DataDdt == null))
            //           select new Report521
            //           {
            //               IDLotto = c.IDLotto,
            //               DataDdt = c.DataDdt,
            //               Giacenza = c.Giacenza,
            //               PrezzoUnitario = (from k in context.Lotti where k.IDPolvere == c.IDPolvere orderby k.DataFattura select k).FirstOrDefault().PrezzoUnitario,
            //               //PrezzoUnitario = l.PrezzoUnitario,
            //               CodicePolvere = c.CodicePolvere,
            //               NumDdt = c.NumDdt,
            //               Famiglia = c.Famiglia,
            //               CodLotto = c.CodLotto,
            //               CodiceCausale = c.CodCausale,
            //               Quantita = c.Quantita,
            //               DatiAbbinati = (from cc1 in context.ComposizioneColori
            //                               where cc1.AnagPolveri.CodicePolvere == c.CodicePolvere
            //                               select new Dati_Associati
            //                               {
            //                                   ColoriAbbinati = cc1.AnagColori.CodiceColore + ", ",
            //                                   Famiglia = cc1.AnagColori.AnagFamiglie.Descrizione + ", "
            //                               })
            //           };

            var obj = from c in context.vw_InventarioMagazzino.AsExpandable().Where(m_filter.SetUpFilter())
                      select new Report521
                      {
                          IDLotto = c.IDLotto,
                          DataDdt = c.DataDdt,
                          Giacenza = c.Giacenza,
                          PrezzoUnitario = (from k in context.Lotti where k.IDPolvere == c.IDPolvere orderby k.DataFattura select k).FirstOrDefault().PrezzoUnitario,
                          //PrezzoUnitario = l.PrezzoUnitario,
                          CodicePolvere = c.CodicePolvere,
                          NumDdt = c.NumDdt,
                          Famiglia = c.Famiglia,
                          CodLotto = c.CodLotto,
                          CodiceCausale = c.CodCausale,
                          Quantita = c.Quantita,
                          DatiAbbinati = (from cc1 in context.ComposizioneColori
                                          where cc1.AnagPolveri.CodicePolvere == c.CodicePolvere
                                          select new Dati_Associati
                                          {
                                              ColoriAbbinati = cc1.AnagColori.CodiceColore + ", ",
                                              Famiglia = cc1.AnagColori.AnagFamiglie.Descrizione + ", "
                                          })
                      };

            return obj;
        }

        private IQueryable<Report521> GetDataByColore()
        {
            GestionePolveriEntities context = this.GetContext();
            var obj = from c in context.vw_InventarioMagazzino
                      where ((c.DataDdt >= m_filter.PeriodFrom) && (c.DataDdt <= m_filter.PeriodTo))
                      select new Report521
                      {
                          IDLotto = c.IDLotto,
                          DataDdt = c.DataDdt,
                          Giacenza = c.Giacenza,
                          PrezzoUnitario = (from k in context.Lotti where k.IDPolvere == c.IDPolvere orderby k.DataFattura select k).FirstOrDefault().PrezzoUnitario,
                          //PrezzoUnitario = l.PrezzoUnitario,
                          CodicePolvere = c.CodicePolvere,
                          NumDdt = c.NumDdt,
                          Famiglia = c.Famiglia,
                          CodLotto = c.CodLotto,
                          CodiceCausale = c.CodCausale,
                          Quantita = c.Quantita,
                          DatiAbbinati = (from cc1 in context.ComposizioneColori
                                          where cc1.AnagPolveri.CodicePolvere == c.CodicePolvere && cc1.AnagColori.IDColore == m_filter.ColoreID
                                          select new Dati_Associati
                                          {
                                              ColoriAbbinati = cc1.AnagColori.CodiceColore + ", ",
                                              Famiglia = cc1.AnagColori.AnagFamiglie.Descrizione + ", "
                                          })
                      };

            return obj;
        }

        private IQueryable<Report521> GetDataByFamiglia()
        {
            GestionePolveriEntities context = this.GetContext();
            var obj = from c in context.vw_InventarioMagazzino
                       where ((c.DataDdt >= m_filter.PeriodFrom) && (c.DataDdt <= m_filter.PeriodTo)) &&
                             c.IDFamiglia == m_filter.FamigliaColoreID
                       select new Report521
                       {
                           IDLotto = c.IDLotto,
                           DataDdt = c.DataDdt,
                           Giacenza = c.Giacenza,
                           PrezzoUnitario = (from k in context.Lotti where k.IDPolvere == c.IDPolvere orderby k.DataFattura select k).FirstOrDefault().PrezzoUnitario,
                           //PrezzoUnitario = l.PrezzoUnitario,
                           CodicePolvere = c.CodicePolvere,
                           NumDdt = c.NumDdt,
                           Famiglia = c.Famiglia,
                           CodLotto = c.CodLotto,
                           DatiAbbinati = (from cc1 in context.ComposizioneColori
                                           where cc1.AnagPolveri.CodicePolvere == c.CodicePolvere
                                           select new Dati_Associati
                                           {
                                               ColoriAbbinati = cc1.AnagColori.CodiceColore + ", ",
                                               Famiglia = cc1.AnagColori.AnagFamiglie.Descrizione + ", "
                                           })
                       };
            return obj;
        }

        /*
        public List<Report521> GetReport521Default()
        {
            List<Report521> retValue = null;

            GestionePolveriEntities context = this.GetContext();
            var obj = from x in context.Lotti
                      where x.DataDdt >= m_filter.PeriodFrom && x.DataDdt <= m_filter.PeriodTo
                      select new Report521
                      {
                          IDLotto = x.IDLotto,
                          DataDdt = x.DataDdt,
                          Giacenza = x.Giacenza,
                          PrezzoUnitario = (from k in context.Lotti where k.IDPolvere == x.IDPolvere orderby k.DataFattura select k).FirstOrDefault().PrezzoUnitario,
                          //PrezzoUnitario = x.PrezzoUnitario,
                          CodicePolvere = x.AnagPolveri.CodicePolvere,
                          NumDdt = x.NumDdt,
                          CodLotto = x.CodLotto
                      };

            if (obj.Any())
            {
                retValue = obj.ToList();
            }

            return retValue;
        }

        public List<Report521> GetReport521DataByPolvere(string codicePolvere)
        {
            List<Report521> retValue = null;

            GestionePolveriEntities context = this.GetContext();
            var obj = from x in context.Lotti
                      where x.AnagPolveri.CodicePolvere == codicePolvere
                      select new Report521
                      {
                          IDLotto = x.IDLotto,
                          DataDdt = x.DataDdt,
                          Giacenza = x.Giacenza,
                          //PrezzoUnitario = x.PrezzoUnitario,
                          PrezzoUnitario = (from k in context.Lotti where k.IDPolvere == x.IDPolvere orderby k.DataFattura select k).FirstOrDefault().PrezzoUnitario,
                          CodicePolvere = x.AnagPolveri.CodicePolvere,
                          NumDdt = x.NumDdt,
                          CodLotto = x.CodLotto
                      };

            if (obj.Any())
            {
                retValue = obj.ToList();
            }

            return retValue;
        }

        public List<Report521> GetReport521DataByColore(string codiceColore)
        {
            List<Report521> retValue = null;

            GestionePolveriEntities context = this.GetContext();
            var obj = from x in context.Lotti
                      where x.AnagPolveri.CodicePolvere == codiceColore
                      select new Report521
                      {
                          IDLotto = x.IDLotto,
                          DataDdt = x.DataDdt,
                          Giacenza = x.Giacenza,
                          //PrezzoUnitario = x.PrezzoUnitario,
                          PrezzoUnitario = (from k in context.Lotti where k.IDPolvere == x.IDPolvere orderby k.DataFattura select k).FirstOrDefault().PrezzoUnitario,
                          CodicePolvere = x.AnagPolveri.CodicePolvere,
                          CodLotto = x.CodLotto
                      };

            if (obj.Any())
            {
                retValue = obj.ToList();
            }

            return retValue;
        }

        public string GetColoriAssociati(string codicePolvere)
        {
            string retValue = null;

            try
            {
                GestionePolveriEntities context = this.GetContext();
                var obj = (from x in context.ComposizioneColori
                          where x.AnagPolveri.CodicePolvere == codicePolvere
                          select (x.AnagColori.CodiceColore + ", ")).Distinct();

                if (obj.Any())
                {
                    obj.ToList().ForEach(x => retValue += x);

                    int i = retValue.LastIndexOf(",");

                    retValue = retValue.Substring(0, i);
                }

            }
            catch (Exception ex)
            {
            }

            return retValue;
        }
         * */
    }
}
